package utils

import (
	"fmt"
	"regexp"
	"strconv"
	"strings"
	"time"
)

func IPhoneNumber(phone string) bool {
	if IsPhone(phone) {
		return true
	} else if IsTelephone(phone) {
		return true
	} else if IsTelephoneShort(phone) {
		return true
	} else {
		return false
	}

	return false
}

// 是否为手机号或者座机号
func IsPhone(phone string) bool {
	pattern := regexp.MustCompile(`^1[3-9]\d{9}$`)
	return pattern.MatchString(phone)
}

func IsTelephone(phone string) bool {
	pattern := regexp.MustCompile(`^\d{3,4}-\d{7,8}$`)
	return pattern.MatchString(phone)
}

func IsTelephoneShort(phone string) bool {
	pattern := regexp.MustCompile(`^\d{7,8}$`)
	return pattern.MatchString(phone)
}

// 当前时间是否在时间段内
func ChecTimeIsRange(timeRanges []string) (bool, error) {
	nowTime := time.Now().Local()
	inRange := false
	for _, tr := range timeRanges {
		startHour, startMinute, endHour, endMinute, err := parseTimeRange(tr)
		if err != nil {
			continue
		}

		if IsWithinTimeRange(nowTime, startHour, startMinute, endHour, endMinute) {
			inRange = true
			break
		}
	}

	return inRange, nil
}

// isWithinTimeRange 判断当前时间是否在指定的时间范围内
func IsWithinTimeRange(now time.Time, startHour int, startMinute int, endHour int, endMinute int) bool {
	currentTime := now.Hour()*60 + now.Minute() // 将当前时间转换为分钟数
	startTime := startHour*60 + startMinute     // 将开始时间转换为分钟数
	endTime := endHour*60 + endMinute           // 将结束时间转换为分钟数

	// 判断当前时间是否在时间范围内
	return currentTime >= startTime && currentTime <= endTime
}

// parseTimeRange 解析时间段字符串（如 "08:00-12:00"）
func parseTimeRange(timeRange string) (startHour, startMinute, endHour, endMinute int, err error) {
	parts := strings.Split(timeRange, "-")
	if len(parts) != 2 {
		err = fmt.Errorf("invalid time range format: %s", timeRange)
		return
	}

	// 解析开始时间
	startParts := strings.Split(parts[0], ":")
	if len(startParts) != 2 {
		err = fmt.Errorf("invalid start time format: %s", parts[0])
		return
	}
	startHour, _ = strconv.Atoi(startParts[0])
	startMinute, _ = strconv.Atoi(startParts[1])

	// 解析结束时间
	endParts := strings.Split(parts[1], ":")
	if len(endParts) != 2 {
		err = fmt.Errorf("invalid end time format: %s", parts[1])
		return
	}
	endHour, _ = strconv.Atoi(endParts[0])
	endMinute, _ = strconv.Atoi(endParts[1])

	return
}

// 判断靓号
func CheckBeautifulNumber(mobile string, numLimit string) bool {
	if numLimit == "" {
		return false
	}

	if len(mobile) != 11 {
		return false
	}

	return true

}

// 处理挂断 0 未知 1 未接通主动挂断 2 接通后挂断 3 命中黑名单，本次通话被拦截 4 呼叫失败
func HangHpStatus(variables map[string]string) int64 {
	if variables["sip_hangup_disposition"] == "recv_cancel" { //FS 主动  --  通话建立后 主叫挂机、脚本挂断
		return 1
	} else if variables["sip_hangup_disposition"] == "send_cancel" { //对端主动  通话建立后 被叫挂机、网关终止
		return 1
	} else if variables["sip_hangup_disposition"] == "send_refuse" { //FS 主动 振铃阶段 振铃超时、主动取消
		return 4
	} else if variables["sip_hangup_disposition"] == "recv_refuse" { // 超时没有接通
		return 4
	} else if variables["sip_hangup_disposition"] == "send_bye" { // 接通主叫挂断
		return 2
	} else if variables["sip_hangup_disposition"] == "recv_bye" { // 接通被叫挂断
		return 2
	}

	return 0
}

func IntArrToString(idsInt []int64) string {
	var idsString []string = IntArrToStringArr(idsInt)
	return strings.Join(idsString, ",")
}

func IntArrToStringArr(idsInt []int64) []string {
	var ids []string = make([]string, len(idsInt))
	for ke, val := range idsInt {
		ids[ke] = fmt.Sprintf("%d", val)
	}

	return ids
}
